《道德經》有云:「執大象,天下往;往而不害,安平太。」Flask,雖微而不弱,取其能「無為」而能「有為」之意。常見開發者埋首 SQL 繁文,逐字排查,不勝其擾。老子謂:「多言數窮,不如守中。」於是 SQLAlchemy ORM 之道,應運而生。
以 Python 編織數據之象,每一表皆類,每一欄皆屬,創建猶如生新物於無形。增刪查改,不必江湖刀劍,只需安坐堂中,命運隨意。對象入 session,操作皆如行雲流水。取數據如取甘霖;無須涉險 SQL 原野,不需頻頻釋義,技術正成為生活之道,回歸人心,順其自然而已。
世人慣以效率為高,計較傷神;然大用無功,大象無形。Flask 如清風;SQLite 如稻田之榖;SQLAlchemy 便是灌溉的清泉。萬物生長,各得其所。Flask + SQLite + SQLAlchemy,何求名利?讓專案自然「活著」,呼吸自如。
身為一個在鍵盤前燃燒生命的開發者,筆者深知時間就是每個人最寶貴的資產。在各種框架和資料庫的無限疊羅漢中,本人在最近學到了一個殘酷的真理:不要為了一個簡單的作品,把自己逼到需要去管資料庫的帳密、網路設定,以及連發五個 SQL 語句才能拿到一個使用者的名字。
這就是筆者為什麼在這次專案的資料庫直接實作 Flask + SQLite + SQLAlchemy 的原因:作品只需要活著,這套組合能讓它活得輕鬆優雅,不給人添麻煩。
SQLite 是輕量級的關聯式資料庫,不需額外安裝伺服器,適合用於開發環境與中小型應用,是快速驗證與原型製作的首選。Flask 本身不內建 ORM,但 Flask-SQLAlchemy 提供了封裝良好的 SQLAlchemy 接口,讓開發者可以用高階物件操作資料庫,而不用直接寫 SQL。
# 1. 產生一個有血有肉的 Python 物件
new_user = User(username='tired_dev', email='dev@example.com')
# 2. 扔進 Session(想像成購物車,等待結帳)
db.session.add(new_user)
# 3. 結帳 (原子性操作:要嘛成功,要嘛失敗,沒有中間狀態)
db.session.commit()
重點在 Session。資料寫入前,所有的操作都在這個「對話」中進行,一直到 commit(),資料才真正被寫入檔案。
# 找出所有名稱以 'A' 開頭的使用者,並按 ID 倒序排列,只要前 10 個
active_users = (
User.query
.filter(User.username.like('A%')) # 條件過濾
.order_by(User.id.desc()) # 排序
.limit(10) # 限制數量
.all() # 執行查詢並獲取結果列表
)
# 找出 ID 為 5 的使用者,如果找不到就直接噴 404 錯誤 (Flask-SQLAlchemy 貼心服務)
important_user = User.query.get_or_404(5)
user = User.query.filter_by(username='tired_dev').first()
if user:
# 直接修改 Python 物件的屬性,不用寫 UPDATE
user.email = 'ITHelp2025xxx@gmail.com'
# 提交。ORM 知道 email 變了,會自動生成 UPDATE 語句
db.session.commit()
user_to_delete = User.query.get(10)
if user_to_delete:
db.session.delete(user_to_delete)
db.session.commit()
溫馨小提醒:
如果刪除前忘記 commit(),那麼這個物件只是在 Session 中被標記為「待刪除」,資料庫檔案還沒動。
Ref.